package com.zyl.blog.common.domain.ai.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;

import java.util.List;

/**
 * @version v1.0
 * @ProjectName: Personal_Blog_Server
 * @Package: com.zyl.blog.common.domain.ai.dto
 * @ClassName: TableMeta
 * @Description:
 * @Author FinalFantasy
 * @Date 2025/8/15-10:23
 */
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class TableMeta {

    /**
     * 表名
     */
    @NotBlank(message = "表名不能为空")
    private String tableName;

    /**
     * 表注释
     */
    private String comment;

    /**
     * 字段列表
     */
    @NotNull(message = "字段列表不能为空")
    private List<ColumnMeta> columns;

    /**
     * 主键列表
     */
    @NotNull(message = "主键不能为空")
    private List<String> primaryKeys;

    /**
     * 索引列表
     */
    private List<IndexMeta> indexes;


    @Data
    @ToString
    @AllArgsConstructor
    @NoArgsConstructor
    @Accessors(chain = true)
    public static class ColumnMeta {

        /**
         * 字段名
         */
        @NotBlank(message = "字段名不能为空")
        private String columnName;

        /**
         * 字段类型
         */
        @NotBlank(message = "字段类型不能为空")
        private String jdbcType;

        /**
         * 类型长度
         */
        private Integer length;

        /**
         * 精度
         */
        private Integer precision;

        /**
         * 规模
         */
        private Integer scale;

        /**
         * 是否允许为null (默认允许)
         */
        private Boolean nullable = true;

        /**
         * 默认值
         */
        private String defaultValue;

        /**
         * 字段注释
         */
        private String comment;

        /**
         * 是否自增（针对主键）
         */
        private Boolean autoIncrement = false;
    }

    @Data
    @ToString
    @AllArgsConstructor
    @NoArgsConstructor
    @Accessors(chain = true)
    public static class IndexMeta {

        /**
         * 索引名称
         */
        @NotBlank(message = "索引名不能为空")
        private String indexName;

        /**
         * 索引字段列表，如idx_template(column1, column2, ...)
         */
        @NotEmpty(message = "索引字段不能为空")
        private List<String> columnNames;

        /**
         * 是否唯一
         */
        private Boolean unique;
    }
}